/*
*  Car.cpp
*
*  Created on: 10 mart , 2015
*  Author: Patrick van ieperen
*/

#include "Car.h"
#include "Wheel.h"
using namespace std;

   Car::Car(const string& model, const string& material, int diameter, int nrWheels)
   {
       this->model = model;
       for (int i =0; i<nrWheels;i++)
       {
            addWheel(diameter,material);
       }
   }

  Car::~Car()
   {
      for (unsigned int i = 0; i< wheels.size();i++)
      {
         delete wheels[i];
      }
      wheels.clear(); // is wel zo netjes om de hele vector met pointers leeg te gooien.
                      // maar hoeft eigenlijk niet
   }

   string Car::getModel()
   {
       return this->model;
   }

   void Car::setLicensePlate(const string& license)
   {
       this->licensePlate = license;
   }

   string Car::getLicensePlate()
   {
       return licensePlate;
   }

   int Car::getNrWheels()
   {
       return wheels.size();
   }

   Wheel* Car::getWheel(int index)
   {
       return wheels[index]; // wheels bevat pointers naar wheels objecten
   }


   void Car::removeWheel(int index)
   {
       delete wheels[index];
       wheels.erase(wheels.begin()+index); // let op ook elementen beginnen te tellen bij 0;

   }

   void Car::addWheel(int diameter, const string& material)
   {
        if (diameter > 0 )
        {
            Wheel *wiel = new Wheel(diameter,material);
            wheels.push_back(wiel);
        }
   }

   Car::Car(const Car& myCar)
   // Dit noemen ze ook wel de copy constructor
   // als parameter wordt een referentie naar een Car object
   // deze functie moet dus een exacte copy maken (deep copy)
   {

       this->licensePlate = myCar.licensePlate;
       this->model = myCar.model;
       for (unsigned int i =0; i<myCar.wheels.size(); i++)
       {
           this->addWheel(myCar.wheels[i]->getDiameter(), myCar.wheels[i]->getMaterial());
       }
   }

   Car& Car::operator=(const Car& mijnCar)
   // Dit is de overloaded assigment operator
   // Deze geeft een referentie terug naar een Car object.
   {
        // kijk even over je niet het zelfde "copieert".
        // bijv. car1 = car2
        if ( this == &mijnCar)
        {
            return *this; // omdat je referentie terug geeft.
        }

        this->licensePlate = mijnCar.licensePlate;
        this->model = mijnCar.model;
        for (unsigned int i =0; i<mijnCar.wheels.size(); i++)
        {
            this->addWheel(mijnCar.wheels[i]->getDiameter(), mijnCar.wheels[i]->getMaterial());
        }
        return *this;
   }
